package com.microservices.yucloud.api.mongo.service;

import act.controller.annotation.UrlContext;
import act.db.DbBind;
import act.db.morphia.MorphiaDao;
import com.microservices.yucloud.api.mongo.entity.Order;
import org.osgl.mvc.annotation.DeleteAction;
import org.osgl.mvc.annotation.GetAction;
import org.osgl.mvc.annotation.PostAction;
import org.osgl.mvc.annotation.PutAction;

import javax.inject.Inject;
import javax.validation.constraints.NotNull;

/**
 * @author zy
 * @date 2019-08-20 20:24
 **/
@UrlContext("orders")
public class OrderService {

    // 这里注入 MorphiaDao, 其类型参数必须设置为 `Order`
    @Inject
    private MorphiaDao<Order> dao;

    @GetAction
    public Iterable<Order> listAll() {
        // dao.q() 返回一个新建的 MorphiaQuery 实例, 其实现了 Iterable<Order> 接口
        return dao.q();
    }

    @GetAction("{order}")
    public Order fetch(@DbBind Order order) {
        // ActFramework 自动从 URL 路径中拿到 order 的 ID, 并从数据库中加载为 order 实例
        return order;
    }

    @PostAction
    public Order create(Order order) {
        // ActFramework 自动从 JSON 或者 Form 数据中
        return dao.save(order);
    }

    @PutAction("{order}/price")
    public void updatePrice(@DbBind @NotNull Order order, int newPrice) {
        order.price = newPrice;
        dao.save(order);
    }

    @DeleteAction("{order}")
    public void delete(@DbBind @NotNull Order order) {
        dao.delete(order);
    }
}
